// bzoj1150
// 题意：
// 在一个一维坐标轴上有n(<=100000)个办公楼，现在要用电缆连接其中不同的
// k(<=n/2)对办公楼，使得电缆的总长度最少，电缆的长度就是两楼的距离。
//
// 题解：
// 首先可以分析出来肯定是连接相邻的楼，那么转换一下题意就是从n-1个线段中
// 选k个不相邻的线段使得长度最小。
//
// 直接贪心取最小的肯定不对，但是可以分析一下，这样做不对的原因比如相邻的
// 三个线段a, b, c，假设b是最小的，那么一定是因为某种方案同时取到a, c比
// 取b还小，而不会是只取一边（这个可以反证）。
//
// 所以我们可以这么做，贪心取最小的区间，如果取到某个区间，那么把它相邻
// 两个区间权值减去自身再加到优先队列中，这样相当于一次取反操作。
//
// 实现的话可以用一个链表把区间都连接起来，然后加上优先队列。
//
// run: $exec < input
#include <iostream>
#include <queue>

long long inf  = (1ll) << 44;
int const maxn = 100100;
long long v[maxn], a[maxn];
int l[maxn], r[maxn];
bool vis[maxn];
int n, k;

struct cmp
{
	bool operator()(int a, int b) { return v[a] > v[b]; }
};

std::priority_queue<int, std::vector<int>, cmp> pq;

int main()
{
	std::ios::sync_with_stdio(false);
	std::cin >> n >> k;
	for (int i = 1; i <= n; i++) std::cin >> a[i];
	a[0] = -inf; a[n + 1] = inf;
	l[0] = 0; r[n + 1] = n + 1;
	for (int i = 1; i <= n + 1; i++) {
		v[i] = a[i] - a[i - 1];
		l[i] = i - 1;
		r[i - 1] = i;
	}
	for (int i = 1; i <= n; i++) pq.push(i);
	long long ans = 0;
	for (int i = 0; i < k; i++) {
		while (vis[pq.top()]) pq.pop();
		int now = pq.top(); pq.pop();
		ans += v[now];
		vis[l[now]] = vis[r[now]] = true;
		v[now] = v[l[now]] + v[r[now]] - v[now];
		l[now] = l[l[now]];
		r[now] = r[r[now]];
		r[l[now]] = l[r[now]] = now;
		pq.push(now);
	}
	std::cout << ans << "\n";
}

